layui.define(['jquery', 'element'], function (exports) {
  "use strict";

  var MOD_NAME = 'tab',
    $ = layui.jquery,
    element = layui.element;

  var pearTab = function (opt) {
    this.option = opt;
  };

  var tabData = new Array();
  var tabDataCurrent = 0;
  var contextTabDOM;

  pearTab.prototype.render = function (opt) {

    var option = {
      elem: opt.elem,
      data: opt.data,
      tool: opt.tool,
      roll: opt.roll,
      index: opt.index,
      width: opt.width,
      height: opt.height,
      tabMax: opt.tabMax,
      session: opt.session ? opt.session : false,
      preload: opt.preload ? opt.preload : false,
      closeEvent: opt.closeEvent,
      success: opt.success ? opt.success : function (id) {
      }
    }

    if (option.session) {
      if (sessionStorage.getItem(option.elem + "-pear-tab-data") != null) {
        tabData = JSON.parse(sessionStorage.getItem(option.elem + "-pear-tab-data"));
        option.data = JSON.parse(sessionStorage.getItem(option.elem + "-pear-tab-data"));
        tabDataCurrent = sessionStorage.getItem(option.elem + "-pear-tab-data-current");
        tabData.forEach(function (item, index) {
          if (item.id == tabDataCurrent) {
            option.index = index;
          }
        })
      } else {
        tabData = opt.data;
      }
    }

    var lastIndex;
    var tab = createTab(option);
    $("#" + option.elem).html(tab);
    $(".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-prev").click(function () {
      rollPage("left", option);
    })
    $(".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-next").click(function () {
      rollPage("right", option);
    })
    element.init();
    toolEvent(option);
    $("#" + option.elem).width(opt.width);
    $("#" + option.elem).height(opt.height);
    $("#" + option.elem).css({
      position: "relative"
    });
    closeEvent(option);

    option.success(sessionStorage.getItem(option.elem + "-pear-tab-data-current"));

    $("body .layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title").on("contextmenu", "li",
      function (e) {
        // 获取当前元素位置
        var top = e.clientY;
        var left = e.clientX;
        var menuWidth = 100;
        var currentId = $(this).attr("lay-id");
        var menu = "<ul><li class='item' id='" + option.elem +
          "closeThis'>" + GV.lang.close_the_current_one + "</li><li class='item' id='" + option.elem +
          "closeOther'>" + GV.lang.close_others + "</li><li class='item' id='" + option.elem +
          "closeAll'>" + GV.lang.close_all + "</li></ul>";

        contextTabDOM = $(this);
        var isOutsideBounds = (left + menuWidth) > $(window).width();
        if (isOutsideBounds) {
          left = $(window).width() - menuWidth;
        }
        // 初始化
        layer.open({
          type: 1,
          title: false,
          shade: false,
          skin: 'pear-tab-menu',
          closeBtn: false,
          area: [menuWidth + 'px', '108px'],
          fixed: true,
          anim: false,
          isOutAnim: false,
          offset: [top, left],
          content: menu, //iframe的url,
          success: function (layero, index) {
            layer.close(lastIndex);
            lastIndex = index;
            menuEvent(option, index);
            var timer;
            $(layero).on('mouseout', function () {
              timer = setTimeout(function () {
                layer.close(index);
              }, 30)
            });

            $(layero).on('mouseover', function () {
              clearTimeout(timer);
            });

            // 清除 item 右击
            $(layero).on('contextmenu', function () {
              return false;
            })

          }
        });
        return false;
      })

    mousewheelAndTouchmoveHandler(option)
    return new pearTab(option);
  }

  pearTab.prototype.click = function (callback) {
    var elem = this.option.elem;
    var option = this.option;
    element.on('tab(' + this.option.elem + ')', function (data) {
      var id = $("#" + elem + " .layui-tab-title .layui-this").attr("lay-id");
      sessionStorage.setItem(option.elem + "-pear-tab-data-current", id);
      if (!option.preload) {
        var $iframe = $(".layui-tab[lay-filter='" + elem + "'] .layui-tab-content").find(
          "iframe[id='" + id + "']");
        var iframeUrl = $iframe.attr("src");
        if (!iframeUrl || iframeUrl === "about:blank") {
          // 获取 url 并重载
          tabData.forEach(function (item, index) {
            if (item.id === id) {
              iframeUrl = item.url;
            }
          })
          tabIframeLoading(elem);
          $iframe.attr("src", iframeUrl);
        }
      }
      callback(id);
    });
  }

  pearTab.prototype.positionTab = function () {
    var $tabTitle = $('.layui-tab[lay-filter=' + this.option.elem + ']  .layui-tab-title');
    var autoLeft = 0;
    $tabTitle.children("li").each(function () {
      if ($(this).hasClass('layui-this')) {
        return false;
      } else {
        autoLeft += $(this).outerWidth();
      }
    });
    $tabTitle.animate({
      scrollLeft: autoLeft - $tabTitle.width() / 3
    }, 200);
  }

  pearTab.prototype.clear = function () {
    sessionStorage.removeItem(this.option.elem + "-pear-tab-data");
    sessionStorage.removeItem(this.option.elem + "-pear-tab-data-current");
  }

  pearTab.prototype.addTab = function (opt) {
    var title = '';
    if (opt.close) {
      title += '<span class="pear-tab-active"></span><span class="able-close title">' + opt.title +
        '</span><i class="layui-icon layui-unselect layui-tab-close">ဆ</i>';
    } else {
      title += '<span class="pear-tab-active"></span><span class="disable-close title">' + opt.title +
        '</span><i class="layui-icon layui-unselect layui-tab-close">ဆ</i>';
    }
    element.tabAdd(this.option.elem, {
      title: title,
      content: '<iframe id="' + opt.id + '" data-frameid="' + opt.id +
        '" scrolling="auto" frameborder="0" src="' +
        opt.url + '" style="width:100%;height:100%;" allowfullscreen="true"></>',
      id: opt.id
    });
    tabData.push(opt);
    sessionStorage.setItem(this.option.elem + "-pear-tab-data", JSON.stringify(tabData));
    sessionStorage.setItem(this.option.elem + "-pear-tab-data-current", opt.id);
    element.tabChange(this.option.elem, opt.id);
  }

  var index = 0;
  // 根据过滤 fliter 标识, 重置选项卡标题
  pearTab.prototype.changeTabTitleById = function (elem, id, title) {
    var currentTab = $(".layui-tab[lay-filter='" + elem + "'] .layui-tab-title [lay-id='" + id +
      "'] .title");
    currentTab.html(title);
  }

  // 根据过滤 filter 标识, 删除指定选项卡
  pearTab.prototype.delTabByElem = function (elem, id, callback) {
    var currentTab = $(".layui-tab[lay-filter='" + elem + "'] .layui-tab-title [lay-id='" + id + "']");
    if (currentTab.find("span").is(".able-close")) {
      tabDelete(elem, id, callback);
    }
  }
  // 根据过滤 filter 标识, 删除其他选项卡
  pearTab.prototype.delOtherTabByElem = function (elem, callback) {
    var currentId = $(".layui-tab[lay-filter='" + elem + "'] .layui-tab-title .layui-this").attr(
      "lay-id");
    var tabtitle = $(".layui-tab[lay-filter='" + elem + "'] .layui-tab-title li");
    $.each(tabtitle, function (i) {
      if ($(this).attr("lay-id") != currentId) {
        if ($(this).find("span").is(".able-close")) {
          tabDelete(elem, $(this).attr("lay-id"), callback);
        }
      }
    })
  }

  // 根据过滤 filter 标识, 删除全部选项卡
  pearTab.prototype.delAllTabByElem = function (elem, callback) {
    var currentId = $(".layui-tab[lay-filter='" + elem + "'] .layui-tab-title .layui-this").attr(
      "lay-id");
    var tabtitle = $(".layui-tab[lay-filter='" + elem + "'] .layui-tab-title li");
    $.each(tabtitle, function (i) {
      if ($(this).find("span").is(".able-close")) {
        tabDelete(elem, $(this).attr("lay-id"), callback);
      }
    })
  }
  // 根据过滤 filter 标识, 删除当前选项卡
  pearTab.prototype.delCurrentTabByElem = function (elem, callback) {
    var currentTab = $(".layui-tab[lay-filter='" + elem + "'] .layui-tab-title .layui-this");
    if (currentTab.find("span").is(".able-close")) {
      var currentId = currentTab.attr("lay-id");
      tabDelete(elem, currentId, callback);
    }
  }

  // 通过过滤 filter 标识, 新增标签页
  pearTab.prototype.addTabOnlyByElem = function (elem, opt, time) {
    var title = '';
    if (opt.close) {
      title += '<span class="pear-tab-active"></span><span class="able-close title">' + opt.title +
        '</span><i class="layui-icon layui-unselect layui-tab-close">ဆ</i>'
    } else {
      title += '<span class="pear-tab-active"></span><span class="disable-close title">' + opt.title +
        '</span><i class="layui-icon layui-unselect layui-tab-close">ဆ</i>'
    }
    if ($(".layui-tab[lay-filter='" + elem + "'] .layui-tab-title li[lay-id]").length <= 0) {
      element.tabAdd(elem, {
        title: title,
        content: '<iframe id="' + opt.id + '" data-frameid="' + opt.id +
          '" scrolling="auto" frameborder="0" src="' +
          opt.url + '" style="width:100%;height:100%;" allowfullscreen="true"></iframe>',
        id: opt.id
      });
      if (time != false && time != 0) {
        tabIframeLoading(elem, opt.id);
      }
      tabData.push(opt);
      sessionStorage.setItem(elem + "-pear-tab-data", JSON.stringify(tabData));
    } else {
      var isData = false;
      $.each($(".layui-tab[lay-filter='" + elem + "'] .layui-tab-title li[lay-id]"), function () {
        if ($(this).attr("lay-id") == opt.id) {
          isData = true;
        }
      })

      if (isData == false) {
        element.tabAdd(elem, {
          title: title,
          content: '<iframe id="' + opt.id + '" data-frameid="' + opt.id +
            '" scrolling="auto" frameborder="0" src="' +
            opt.url + '" style="width:100%;height:100%;" allowfullscreen="true"></iframe>',
          id: opt.id
        });
        if (time != false && time != 0) {
          tabIframeLoading(elem, opt.id);
        }
        tabData.push(opt);
        sessionStorage.setItem(elem + "-pear-tab-data", JSON.stringify(tabData));

      }
    }
    sessionStorage.setItem(elem + "-pear-tab-data-current", opt.id);
    element.tabChange(elem, opt.id);
  }

  /** 添 加 唯 一 选 项 卡 */
  pearTab.prototype.addTabOnly = function (opt, time) {
    var title = '';
    if (opt.close) {
      title += '<span class="pear-tab-active"></span><span class="able-close title">' + opt.title +
        '</span><i class="layui-icon layui-unselect layui-tab-close">ဆ</i>';
    } else {
      title += '<span class="pear-tab-active"></span><span class="disable-close title">' + opt.title +
        '</span><i class="layui-icon layui-unselect layui-tab-close">ဆ</i>';
    }
    if ($(".layui-tab[lay-filter='" + this.option.elem + "'] .layui-tab-title li[lay-id]").length <=
      0) {
      element.tabAdd(this.option.elem, {
        title: title,
        content: '<iframe id="' + opt.id + '" data-frameid="' + opt.id +
          '" scrolling="auto" frameborder="0" src="' +
          opt.url + '" style="width:100%;height:100%;" allowfullscreen="true"></iframe>',
        id: opt.id
      });
      if (time != false && time != 0) {
        tabIframeLoading(this.option.elem, opt.id);
      }
      tabData.push(opt);
      sessionStorage.setItem(this.option.elem + "-pear-tab-data", JSON.stringify(tabData));
      sessionStorage.setItem(this.option.elem + "-pear-tab-data-current", opt.id);
    } else {
      var isData = false;
      $.each($(".layui-tab[lay-filter='" + this.option.elem + "'] .layui-tab-title li[lay-id]"),
        function () {
          if ($(this).attr("lay-id") == opt.id) {
            isData = true;
          }
        })
      if (isData == false) {

        if (this.option.tabMax != false) {
          if ($(".layui-tab[lay-filter='" + this.option.elem + "'] .layui-tab-title li[lay-id]")
            .length >= this.option.tabMax) {
            layer.msg("最多打开" + this.option.tabMax + "个标签页", {
              icon: 2,
              time: 1000,
              shift: 6
            });
            return false;
          }
        }

        element.tabAdd(this.option.elem, {
          title: title,
          content: '<iframe id="' + opt.id + '" data-frameid="' + opt.id +
            '" scrolling="auto" frameborder="0" src="' +
            opt.url + '" style="width:100%;height:100%;" allowfullscreen="true"></iframe>',
          id: opt.id
        });
        if (time != false && time != 0) {
          tabIframeLoading(this.option.elem, opt.id);
        }
        tabData.push(opt);
        sessionStorage.setItem(this.option.elem + "-pear-tab-data", JSON.stringify(tabData));
        sessionStorage.setItem(this.option.elem + "-pear-tab-data-current", opt.id);
      }
    }
    element.tabChange(this.option.elem, opt.id);
    sessionStorage.setItem(this.option.elem + "-pear-tab-data-current", opt.id);
  }

  // 刷 新 指 定 的 选 项 卡
  pearTab.prototype.refresh = function (time) {
    // 刷 新 指 定 的 选 项 卡
    var $iframe = $(".layui-tab[lay-filter='" + this.option.elem + "'] .layui-tab-content .layui-show")
      .find("iframe");
    if (time != false && time != 0) {
      tabIframeLoading(this.option.elem);
    }
    $iframe.attr("src", $iframe.attr("src"));
  }

  function tabIframeLoading(elem, id) {
    var load = '<div id="pear-tab-loading' + index + '" class="pear-tab-loading">' +
      '<div class="ball-loader">' +
      '<span></span><span></span><span></span><span></span>' +
      '</div>' +
      '</div>'
    var $iframe = $(".layui-tab[lay-filter='" + elem + "'] .layui-tab-content .layui-show").find("iframe");
    if (id) {
      $iframe = $(".layui-tab[lay-filter='" + elem + "'] .layui-tab-content").find("iframe[id='" + id +
        "']");
    }
    $iframe.parent().append(load);
    var pearLoad = $("#" + elem).find("#pear-tab-loading" + index);
    pearLoad.css({
      display: "block"
    });
    index++;
    $iframe.on("load", function () {
      pearLoad.fadeOut(200, function () {
        pearLoad.remove();
      });
    })
  }

  function tabDelete(elem, id, callback, option) {
    //根据 elem id 来删除指定的 layui title li
    var tabTitle = $(".layui-tab[lay-filter='" + elem + "']").find(".layui-tab-title");

    // 删除指定 id 的 title
    var removeTab = tabTitle.find("li[lay-id='" + id + "']");
    var nextNode = removeTab.next("li");
    if (!removeTab.hasClass("layui-this")) {
      removeTab.remove();
      var tabContent = $(".layui-tab[lay-filter='" + elem + "']").find("iframe[id='" + id + "']")
        .parent();
      tabContent.remove();

      tabData = JSON.parse(sessionStorage.getItem(elem + "-pear-tab-data"));
      tabDataCurrent = sessionStorage.getItem(elem + "-pear-tab-data-current");
      tabData = tabData.filter(function (item) {
        return item.id != id;
      })
      sessionStorage.setItem(elem + "-pear-tab-data", JSON.stringify(tabData));
      return false;
    }

    var currId;
    if (nextNode.length) {
      nextNode.addClass("layui-this");
      currId = nextNode.attr("lay-id");
      $("#" + elem + " [id='" + currId + "']").parent().addClass("layui-show");
    } else {
      var prevNode = removeTab.prev("li");
      prevNode.addClass("layui-this");
      currId = prevNode.attr("lay-id");
      $("#" + elem + " [id='" + currId + "']").parent().addClass("layui-show");
    }
    callback(currId);
    tabData = JSON.parse(sessionStorage.getItem(elem + "-pear-tab-data"));
    tabDataCurrent = sessionStorage.getItem(elem + "-pear-tab-data-current");
    tabData = tabData.filter(function (item) {
      return item.id != id;
    })
    sessionStorage.setItem(elem + "-pear-tab-data", JSON.stringify(tabData));
    sessionStorage.setItem(elem + "-pear-tab-data-current", currId);

    removeTab.remove();
    // 删除 content
    var tabContent = $(".layui-tab[lay-filter='" + elem + "']").find("iframe[id='" + id + "']").parent();
    // 删除
    tabContent.remove();
  }

  function createTab(option) {

    var type = "";
    var types = option.type + " ";
    if (option.roll == true) {
      type = "layui-tab-roll";
    }
    if (option.tool != false) {
      type = "layui-tab-tool";
    }
    if (option.roll == true && option.tool != false) {
      type = "layui-tab-rollTool";
    }
    var tab = '<div class="pear-tab ' + types + type + ' layui-tab" lay-filter="' + option.elem +
      '" lay-allowClose="true">';
    var title = '<ul class="layui-tab-title">';
    var content = '<div class="layui-tab-content">';
    var control =
      '<div class="layui-tab-control"><li class="layui-tab-prev layui-icon layui-icon-left"></li><li class="layui-tab-next layui-icon layui-icon-right"></li><li class="layui-tab-tool layui-icon layui-icon-down"><ul class="layui-nav" lay-filter=""><li class="layui-nav-item"><a href="javascript:;"></a><dl class="layui-nav-child">';

    // 处 理 选 项 卡 头 部
    var index = 0;
    $.each(option.data, function (i, item) {
      var TitleItem = '';
      if (option.index == index) {
        TitleItem += '<li lay-id="' + item.id +
          '" class="layui-this"><span class="pear-tab-active"></span>';
      } else {
        TitleItem += '<li lay-id="' + item.id + '" ><span class="pear-tab-active"></span>';
      }

      if (item.close) {
        // 当 前 选 项 卡 可 以 关 闭
        TitleItem += '<span class="able-close title">' + item.title + '</span>';
      } else {
        // 当 前 选 项 卡 不 允 许 关 闭
        TitleItem += '<span class="disable-close title">' + item.title + '</span>';
      }
      TitleItem += '<i class="layui-icon layui-unselect layui-tab-close">ဆ</i></li>';
      title += TitleItem;
      if (option.index == index) {

        // 处 理 显 示 内 容
        content += '<div class="layui-show layui-tab-item"><iframe id="' + item.id +
          '" data-frameid="' + item.id +
          '"  src="' + item.url +
          '" frameborder="no" border="0" marginwidth="0" marginheight="0" style="width: 100%;height: 100%;" allowfullscreen="true"></iframe></div>'
      } else {
        if (!option.preload) {
          item.url = "about:blank";
        }
        // 处 理 显 示 内 容
        content += '<div class="layui-tab-item"><iframe id="' + item.id + '" data-frameid="' +
          item.id + '"  src="' +
          item.url +
          '" frameborder="no" border="0" marginwidth="0" marginheight="0" style="width: 100%;height: 100%;" allowfullscreen="true"></iframe></div>'
      }
      index++;
    });

    title += '</ul>';
    content += '</div>';
    control += '<dd id="closeThis"><a href="#">关 闭 当 前</a></dd>'
    control += '<dd id="closeOther"><a href="#">关 闭 其 他</a></dd>'
    control += '<dd id="closeAll"><a href="#">关 闭 全 部</a></dd>'
    control += '</dl></li></ul></li></div>';

    tab += title;
    tab += control;
    tab += content;
    tab += '</div>';
    tab += ''
    return tab;
  }

  function rollPage(d, option) {
    var $tabTitle = $('#' + option.elem + '  .layui-tab-title');
    var left = $tabTitle.scrollLeft();
    if ('left' === d) {
      $tabTitle.animate({
        scrollLeft: left - 450
      }, 200);
    } else {
      $tabTitle.animate({
        scrollLeft: left + 450
      }, 200);
    }
  }

  function closeEvent(option) {
    $(".layui-tab[lay-filter='" + option.elem + "']").on("click", ".layui-tab-close", function () {
      var layid = $(this).parent().attr("lay-id");
      tabDelete(option.elem, layid, option.closeEvent, option);
    })
  }

  function menuEvent(option, index) {

    $("#" + option.elem + "closeThis").click(function () {
      var currentTab = contextTabDOM;

      if (currentTab.find("span").is(".able-close")) {
        var currentId = currentTab.attr("lay-id");
        tabDelete(option.elem, currentId, option.closeEvent, option);
      } else {
        layer.msg("当前页面不允许关闭", {
          icon: 3,
          time: 800
        })
      }
      layer.close(index);
    })

    $("#" + option.elem + "closeOther").click(function () {
      var currentId = contextTabDOM.attr("lay-id");
      var tabtitle = $(".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title li");
      $.each(tabtitle, function (i) {
        if ($(this).attr("lay-id") != currentId) {
          if ($(this).find("span").is(".able-close")) {
            tabDelete(option.elem, $(this).attr("lay-id"), option.closeEvent,
              option);
          }
        }
      })
      layer.close(index);
    })

    $("#" + option.elem + "closeAll").click(function () {
      var currentId = contextTabDOM.attr("lay-id");
      var tabtitle = $(".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title li");
      $.each(tabtitle, function (i) {
        if ($(this).find("span").is(".able-close")) {
          tabDelete(option.elem, $(this).attr("lay-id"), option.closeEvent, option);
        }
      })
      layer.close(index);
    })
  }

  function toolEvent(option) {
    $("body .layui-tab[lay-filter='" + option.elem + "']").on("click", "#closeThis", function () {
      var currentTab = $(".layui-tab[lay-filter='" + option.elem +
        "'] .layui-tab-title .layui-this");
      if (currentTab.find("span").is(".able-close")) {
        var currentId = currentTab.attr("lay-id");
        tabDelete(option.elem, currentId, option.closeEvent, option);
      } else {
        layer.msg("当前页面不允许关闭", {
          icon: 3,
          time: 800
        })
      }
    })

    $("body .layui-tab[lay-filter='" + option.elem + "']").on("click", "#closeOther", function () {
      var currentId = $(".layui-tab[lay-filter='" + option.elem +
        "'] .layui-tab-title .layui-this").attr("lay-id");
      var tabtitle = $(".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title li");
      $.each(tabtitle, function (i) {
        if ($(this).attr("lay-id") != currentId) {
          if ($(this).find("span").is(".able-close")) {
            tabDelete(option.elem, $(this).attr("lay-id"), option.closeEvent,
              option);
          }
        }
      })
    })

    $("body .layui-tab[lay-filter='" + option.elem + "']").on("click", "#closeAll", function () {
      var currentId = $(".layui-tab[lay-filter='" + option.elem +
        "'] .layui-tab-title .layui-this").attr("lay-id");
      var tabtitle = $(".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title li");
      $.each(tabtitle, function (i) {
        if ($(this).find("span").is(".able-close")) {
          tabDelete(option.elem, $(this).attr("lay-id"), option.closeEvent, option);
        }
      })
    })
  }

  function mousewheelAndTouchmoveHandler(option) {
    var $bodyTab = $("body .layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title")
    var $tabTitle = $('#' + option.elem + '  .layui-tab-title');
    var mouseScrollStep = 100
    // 鼠标滚轮
    $bodyTab.on("mousewheel DOMMouseScroll", function (e) {
      e.originalEvent.preventDefault()
      var delta = (e.originalEvent.wheelDelta && (e.originalEvent.wheelDelta > 0 ? "top" :
          "down")) || // chrome & ie
        (e.originalEvent.detail && (e.originalEvent.detail > 0 ? "down" : "top")); // firefox
      var scrollLeft = $tabTitle.scrollLeft();

      if (delta === "top") {
        scrollLeft -= mouseScrollStep
      } else if (delta === "down") {
        scrollLeft += mouseScrollStep
      }
      $tabTitle.scrollLeft(scrollLeft)
    });

    // 触摸移动
    var touchX = 0;
    $bodyTab.on("touchstart", function (e) {
      var touch = e.originalEvent.targetTouches[0];
      touchX = touch.pageX
    })
    $bodyTab.on("touchmove", function (e) {
      var event = e.originalEvent;
      if (event.targetTouches.length > 1) return;
      event.preventDefault();
      var touch = event.targetTouches[0];
      var distanceX = touchX - touch.pageX
      var scrollLeft = $tabTitle.scrollLeft();
      touchX = touch.pageX
      $tabTitle.scrollLeft(scrollLeft += distanceX)
    });
  }

  exports(MOD_NAME, new pearTab());
})
